package com.easy.sk.system.controller;

import com.alipay.api.AlipayApiException;
import com.easy.common.bean.Order;
import com.easy.common.bean.SeckillOrder;
import com.easy.common.service.IOrderService;
import com.easy.common.service.ISeckillOrderService;
import com.easy.sk.system.config.AlipayTemplate;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Map;

/**
 * 支付宝接口
 */
@RestController
@RequestMapping("/seckill/order/alipay")
public class AliPayController {

    @Resource
    private AlipayTemplate alipayTemplate;

    @Resource
    private ISeckillOrderService seckillOrderService; // 注入订单服务

    /**
     * 生成支付宝支付页面
     */
    @GetMapping(value = "/pay", produces = "text/html")
    @ResponseBody
    public String pay(@RequestParam Integer id) throws AlipayApiException {
        // 1. 根据订单ID查询真实订单信息
        SeckillOrder seckillOrder = seckillOrderService.getById(id);
        if (seckillOrder == null) {
            throw new RuntimeException("订单不存在");
        }
        // 2. 调用支付宝模板生成支付页面
        return alipayTemplate.pay(seckillOrder);
    }
//接受登录信息直接返回
    /**
     * 支付宝同步通知接口
     * 用户支付完成后，支付宝会跳转到这个接口
     */
    @GetMapping("/return")
    public String payReturn(HttpServletRequest request) {
        System.out.println("===========================================");
        System.out.println("收到支付宝同步回调通知");
        System.out.println("===========================================");

        try {
            // 打印所有回调参数
            Map<String, String[]> requestParams = request.getParameterMap();
            System.out.println("所有回调参数:");
            for (String name : requestParams.keySet()) {
                String value = request.getParameter(name);
                System.out.println(name + " = " + value);
            }

            // 获取关键参数
            String outTradeNo = request.getParameter("out_trade_no");
            String gmtPayment = request.getParameter("gmt_payment");
            String tradeStatus = request.getParameter("trade_status");

            System.out.println("商户订单号: " + outTradeNo);
            System.out.println("支付时间: " + gmtPayment);
            System.out.println("交易状态: " + tradeStatus);

            // 即使没有trade_status，只要outTradeNo存在，我们也认为支付成功
            // 因为用户能访问到这个页面，说明已经从支付宝返回了
            if (outTradeNo != null && !outTradeNo.isEmpty()) {
                System.out.println("开始处理订单状态更新逻辑");

                // 解析订单ID
                int seckillOrderId = -1;
                try {
                    if (outTradeNo.startsWith("S") && outTradeNo.length() >= 7) {
                        // 格式如: S0912001 (X+月日+ID)
                        String idPart = outTradeNo.substring(5); // 跳过S和月日部分
                        seckillOrderId = Integer.parseInt(idPart);
                    } else {
                        // 直接是数字格式
                        seckillOrderId = Integer.parseInt(outTradeNo);
                    }
                } catch (Exception e) {
                    System.err.println("解析订单ID失败: " + outTradeNo);
                }

                System.out.println("解析后的订单ID: " + seckillOrderId);

                if (seckillOrderId > 0) {
                    SeckillOrder seckillOrder = seckillOrderService.getById(seckillOrderId);
                    System.out.println("查询到的订单: " + (seckillOrder != null ? "存在" : "不存在"));

                    if (seckillOrder != null) {
                        System.out.println("订单当前状态: " + seckillOrder.getStatus());

                        // 检查订单状态，避免重复处理
                        if (seckillOrder.getStatus() == null || seckillOrder.getStatus() == 0) {
                            // 更新订单状态为已支付
                            seckillOrder.setStatus(1);
                            System.out.println("设置订单状态为1（已支付）");

                            // 设置支付时间
                            if (gmtPayment != null && !gmtPayment.isEmpty()) {
                                try {
                                    System.out.println("尝试解析支付时间: " + gmtPayment);
                                    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                                    seckillOrder.setPay_time(LocalDateTime.parse(gmtPayment, formatter));
                                    System.out.println("支付时间设置成功");
                                } catch (Exception e) {
                                    System.err.println("支付时间解析失败: " + e.getMessage());
                                    seckillOrder.setPay_time(LocalDateTime.now());
                                }
                            } else {
                                System.out.println("支付时间为空，使用当前时间");
                                seckillOrder.setPay_time(LocalDateTime.now());
                            }

                            System.out.println("准备更新订单到数据库");
                            int result = seckillOrderService.updateSeckillOrder(seckillOrder);
                            System.out.println("数据库更新结果: " + (result > 0 ? "成功" : "失败"));
                        } else {
                            System.out.println("订单状态已更新，无需重复处理");
                        }
                    } else {
                        System.err.println("未找到对应订单");
                    }
                } else {
                    System.err.println("无法解析订单ID");
                }
            } else {
                System.err.println("商户订单号为空或不存在");
            }
        } catch (Exception e) {
            System.err.println("处理同步回调异常: " + e.getMessage());
            e.printStackTrace();
        }

        // 重定向到订单列表页面
        return "<html><body><script>window.location.href='http://localhost:8888/user/orderList';</script></body></html>";
    }

//不需要登录
    /**
     * 支付宝异步通知接口
     */
    @PostMapping("/notify")
    public String payNotify(HttpServletRequest request) {
        // 简单记录日志，然后返回success
        System.out.println("收到支付宝异步通知，但使用同步回调处理订单状态");
        return "success";
    }
}